/** 节点类型 */
export enum ENodeType {
	/** 发起节点 */
	PROMOTER = 0,
	/** 审批节点 */
	APPROVER = 1,
	/** 分支节点 */
	BRANCH = 4,
	/** 条件分支 */
	CONDITION = 3,
	/** 抄送节点 */
	SEND = 2,
}

/** 审批人员类型 */
export enum EApproverType {
	/** 指定用户 */
	USER = 1,
	/** 主管 */
	DIRECTOR = 2,
	/** 连续多级主管 */
	MULTI_LEVEL = 3,
}

/** 用户选择模式 */
export enum EUserSelectType {
	/** 选择用户 */
	USER = 1,
	/** 选择角色 */
	ROLE = 2,
}

export interface ISelectItem {
	id: string;
	name: string;
}

/** 连续主管审批终点 */
export enum EDirectorMode {
	/** 直到最上层主管 */
	TOP = 0,
	/** 自定义审批终点 */
	CUSTOM = 1,
}

/** 多人审批时审批方式 */
export enum EExamineMode {
	/** 按顺序依次审批 */
	ORDER = 1,
	/** 会签 (可同时审批，每个人必须审批通过) */
	EVERY = 2,
	/** 或签 (有一人审批通过即可) */
	SOME = 3,
}

/** 审批期限超时后执行类型 */
export enum ETermMode {
	/** 自动通过 */
	PASS = 0,
	/** 自动拒绝 */
	REJECT = 1,
}

export interface INodeConfig {
	nodeName: string;
	type: ENodeType;
	childNode?: AddNodeType;
}

export interface IPromoterNodeConfig extends INodeConfig {
	type: ENodeType.PROMOTER;
	nodeRoleList: ISelectItem[];
	childNode: AddNodeType;
}

export interface IApproverNodeConfig extends INodeConfig {
	type: ENodeType.APPROVER;
	/** 审核人类型 */
	setType: EApproverType;
	/** 指定主管层级 */
	examineLevel: number;
	/** 连续主管审批方式 */
	directorMode: EDirectorMode;
	/** 自定义连续主管审批层级 */
	directorLevel: number;
	/** 多人审批时审批方式 */
	examineMode: EExamineMode;
	/** 审批期限超时自动审批 */
	termAuto: boolean;
	/** 审批期限 */
	term: number;
	/** 审批期限超时后执行类型 */
	termMode: ETermMode;
	nodeUserList: ISelectItem[];
}

export interface ISendNodeConfig extends INodeConfig {
	type: ENodeType.SEND;
	userSelectFlag: boolean;
	nodeUserList: ISelectItem[];
}

/** 条件关系 */
export enum EConditionMode {
	/** 且 */
	AND = 1,
	/** 或 */
	OR = 2,
}

interface ICondition {
	label: string;
	field: string;
	operator: string;
	value: string;
}
export type IConditionGroup = ICondition[];
export interface IConditionNodeConfig extends INodeConfig {
	type: ENodeType.CONDITION;
	conditionList: IConditionGroup[];
	priorityLevel: number;
	conditionMode: EConditionMode;
}

export interface IBranchNodeConfig extends INodeConfig {
	type: ENodeType.BRANCH;
	conditionNodes: IConditionNodeConfig[];
}

export type AddNodeType = IApproverNodeConfig | ISendNodeConfig | IBranchNodeConfig | IPromoterNodeConfig;

export interface IWorkflowConfig {
	id: string;
	name: string;
	nodeConfig: INodeConfig;
}
